﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TankController.Dominio
{
    public class Matriz
    {
        private int n;
        private int m;
        private double[,] elementos;

        public int N
        {
            get { return n; }
        }
        public int M
        {
            get { return m; }
        }
        public double this[int i, int j]
        {
            get { return elementos[i, j]; }
            set { elementos[i, j] = value; }
        }

        public Matriz(int n, int m)
        {
            this.n = n;
            this.m = m;

            this.elementos = new double[n, m];
        }

        public static Matriz operator +(Matriz m1, Matriz m2)
        {
            Matriz novaMatriz = new Matriz(m1.N, m1.M);

            for (int i = 0; i < m1.N; i++)
            {
                for (int j = 0; j < m1.M; j++)
                {
                    novaMatriz[i, j] = m1[i, j] + m2[i, j];
                }
            }

            return novaMatriz;
        }

        public static Matriz operator -(Matriz m1, Matriz m2)
        {
            Matriz novaMatriz = new Matriz(m1.N, m1.M);

            for (int i = 0; i < m1.N; i++)
            {
                for (int j = 0; j < m1.M; j++)
                {
                    novaMatriz[i, j] = m1[i, j] - m2[i, j];
                }
            }

            return novaMatriz;
        }

        public static Matriz operator *(double k, Matriz m1)
        {
            Matriz novaMatriz = new Matriz(m1.N, m1.M);

            for (int i = 0; i < m1.N; i++)
            {
                for (int j = 0; j < m1.M; j++)
                {
                    novaMatriz[i, j] = k * m1[i, j];
                }
            }

            return novaMatriz;
        }

        public static Matriz operator *(Matriz m1, Matriz m2)
        {
            Matriz novaMatriz = new Matriz(m1.N, m2.M);

            double acumulado;

            for (int i = 0; i < m1.N; i++)
            {
                for (int j = 0; j < m2.M; j++)
                {
                    acumulado = 0;

                    for (int k = 0; k < m2.N; k++)
                    {
                        acumulado += m1[i, k] * m2[k, j];
                    }

                    novaMatriz[i, j] = acumulado;
                }
            }

            return novaMatriz;
        }
    }
}
